<!-------- @HEADER
 !
 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !
 !  Zoltan Toolkit for Load-balancing, Partitioning, Ordering and Coloring
 !                  Copyright 2012 Sandia Corporation
 !
 ! Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
 ! the U.S. Government retains certain rights in this software.
 !
 ! Redistribution and use in source and binary forms, with or without
 ! modification, are permitted provided that the following conditions are
 ! met:
 !
 ! 1. Redistributions of source code must retain the above copyright
 ! notice, this list of conditions and the following disclaimer.
 !
 ! 2. Redistributions in binary form must reproduce the above copyright
 ! notice, this list of conditions and the following disclaimer in the
 ! documentation and/or other materials provided with the distribution.
 !
 ! 3. Neither the name of the Corporation nor the names of the
 ! contributors may be used to endorse or promote products derived from
 ! this software without specific prior written permission.
 !
 ! THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
 ! EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 ! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 ! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
 ! CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 ! EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 ! PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 ! PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 ! LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 ! NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 ! SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 !
 ! Questions? Contact Karen Devine	kddevin@sandia.gov
 !                    Erik Boman	egboman@sandia.gov
 !
 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !
 ! @HEADER
-------> 
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
   <meta name="GENERATOR" content="Mozilla/4.7 [en] (X11; U; SunOS 5.6 sun4m) [Netscape]">
  <meta name="sandia.approval_type" content="formal">
  <meta name="sandia.approved" content="SAND2007-4748W">
  <meta name="author" content="Zoltan PI">

   <title>Zoltan User's Guide:  Migration Query Functions</title>

</head>
<body bgcolor="#FFFFFF">

<div align=right><b><i><a href="ug.html">Zoltan User's Guide</a>&nbsp;
|&nbsp; <a href="ug_param.html">Next</a>&nbsp; |&nbsp; <a href="ug_query_lb.html">Previous</a></i></b></div>

<h2>
<a NAME="Migration Query Functions"></a>Migration Query Functions</h2>
The following query functions must be registered to use any of the migration
tools described in <a href="ug_interface_mig.html">Migration Functions</a>.
These functions should NOT use interprocessor communication.
<blockquote>
<b><a href="#ZOLTAN_OBJ_SIZE_MULTI_FN">ZOLTAN_OBJ_SIZE_MULTI_FN</a></b>
or
<b><a href="#ZOLTAN_OBJ_SIZE_FN">ZOLTAN_OBJ_SIZE_FN</a></b> 
<br>
<b><a href="#ZOLTAN_PACK_OBJ_MULTI_FN">ZOLTAN_PACK_OBJ_MULTI_FN</a></b>
or
<b><a href="#ZOLTAN_PACK_OBJ_FN">ZOLTAN_PACK_OBJ_FN</a></b> 
<br>
<b><a href="#ZOLTAN_UNPACK_OBJ_MULTI_FN">ZOLTAN_UNPACK_OBJ_MULTI_FN</a></b>
or
<b><a href="#ZOLTAN_UNPACK_OBJ_FN">ZOLTAN_UNPACK_OBJ_FN</a></b> 
</blockquote>
The "MULTI_" versions of the packing/unpacking functions take lists of IDs
as input and pack/unpack data for all objects in the lists.  Only one function
of each type must be provided (e.g., either a 
<b><a href="#ZOLTAN_PACK_OBJ_FN">ZOLTAN_PACK_OBJ_FN</a></b> or
<b><a href="#ZOLTAN_PACK_OBJ_MULTI_FN">ZOLTAN_PACK_OBJ_MULTI_FN</a></b>,
but not both).
<p>
Optional, additional query functions for migration may also be registered; these
functions are called at the beginning, middle, and end of migration in
<a href="ug_interface_mig.html#Zoltan_Migrate"><b>Zoltan_Migrate</b></a>.
Interprocessor communication is allowed in these functions.
<blockquote>
<b><a href="#ZOLTAN_PRE_MIGRATE_PP_FN">ZOLTAN_PRE_MIGRATE_PP_FN</a></b>
<br><b><a href="#ZOLTAN_MID_MIGRATE_PP_FN">ZOLTAN_MID_MIGRATE_PP_FN</a></b>
<br><b><a href="#ZOLTAN_POST_MIGRATE_PP_FN">ZOLTAN_POST_MIGRATE_PP_FN</a></b>
</blockquote>

For <a href="ug_backward.html">backward compatibility</a> 
with previous versions of Zoltan, 
the following functions may be used with 
<a href="ug_interface_mig.html#Zoltan_Help_Migrate"><b>Zoltan_Help_Migrate</b></a>.
<blockquote>
<b><a href="#ZOLTAN_PRE_MIGRATE_FN">ZOLTAN_PRE_MIGRATE_FN</a></b>
<br><b><a href="#ZOLTAN_MID_MIGRATE_FN">ZOLTAN_MID_MIGRATE_FN</a></b>
<br><b><a href="#ZOLTAN_POST_MIGRATE_FN">ZOLTAN_POST_MIGRATE_FN</a></b>
</blockquote>

<!------------------------------------------------------------------------->
<hr WIDTH="100%">
<a NAME="ZOLTAN_OBJ_SIZE_FN"></a>
<hr WIDTH="100%">
<table WIDTH="100%" NOSAVE >
<tr NOSAVE>
<td VALIGN=TOP NOSAVE>C and C++:</td>

<td WIDTH="85%">
typedef int <b>ZOLTAN_OBJ_SIZE_FN</b>(
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void *<i>data</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_gid_entries</i>,&nbsp; 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_lid_entries</i>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>global_id</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>local_id</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>*ierr</i>);
</td>
</tr>

<tr NOSAVE>
<td VALIGN=TOP WIDTH="15%" NOSAVE>FORTRAN:</td>

<td>FUNCTION <b><i>Obj_Size</i></b>(<i>data, num_gid_entries,&nbsp; num_lid_entries</i>,
<i>global_id, local_id, ierr</i>)&nbsp;
<br>INTEGER(Zoltan_INT) :: Obj_Size&nbsp;
<br>&lt;<i>type-data</i>>, INTENT(IN) :: data&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN) :: num_gid_entries, num_lid_entries
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: global_id,&nbsp; local_id
<br>INTEGER(Zoltan_INT), INTENT(OUT) :: ierr&nbsp;
<p>&lt;<i>type-data</i>> can be any of INTEGER(Zoltan_INT), DIMENSION(*) or
REAL(Zoltan_FLOAT), DIMENSION(*) or REAL(Zoltan_DOUBLE), DIMENSION(*) or TYPE(Zoltan_User_Data_<i>x</i>)
where <i>x</i> is 1, 2, 3 or 4. See the section on
<a href="ug_fortran_api.html#fortran ug api query">Fortran
query functions</a> for an explanation.&nbsp;</td>
</tr>
</table>

<hr WIDTH="100%">A <b>ZOLTAN_OBJ_SIZE_FN</b> query function returns the size
(in bytes) of the data buffer that is needed to pack all of a single object's
data.
<br>&nbsp;
<table WIDTH="100%" NOSAVE >
<tr>
<td VALIGN=TOP WIDTH="20%"><b>Function Type:</b></td>

<td WIDTH="80%"><b>ZOLTAN_OBJ_SIZE_FN_TYPE</b></td>
</tr>

<tr>
<td VALIGN=TOP><b>Arguments:</b></td>

<td></td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; data</i></td>

<td>Pointer to user-defined data.</td>
</tr>

<tr VALIGN=TOP NOSAVE>
<td>&nbsp;&nbsp; <i>num_gid_entries</i></td>

<td NOSAVE>The number of array entries used to describe a single global
ID.&nbsp; This value is the maximum value over all processors of the parameter
<a href="ug_param.html#NUM_GID_ENTRIES">NUM_GID_ENTRIES</a>.</td>
</tr>

<tr VALIGN=TOP NOSAVE>
<td><i>&nbsp;&nbsp; num_lid_entries</i></td>

<td NOSAVE>The number of array entries used to describe a single local
ID.&nbsp; This value is the maximum value over all processors of the parameter
<a href="ug_param.html#NUM_LID_ENTRIES">NUM_LID_ENTRIES</a>.</td>
</tr>

<tr>
<td>&nbsp;&nbsp; <i>global_id</i></td>

<td>Pointer to the global ID of the object.</td>
</tr>

<tr>
<td>&nbsp;&nbsp; <i>local_id</i></td>

<td>Pointer to the local ID of the object.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp; ierr</i></td>

<td>Error code to be set by function.</td>
</tr>

<tr>
<td VALIGN=TOP><b>Returned Value:</b></td>

<td></td>
</tr>

<tr>
<td VALIGN=TOP>&nbsp;&nbsp;&nbsp; int</td>

<td>The size (in bytes) of the required data buffer.</td>
</tr>
</table>

<p>

<!------------------------------------------------------------------------->
<hr WIDTH="100%">
<a NAME="ZOLTAN_OBJ_SIZE_MULTI_FN"></a>
<hr WIDTH="100%">
<table WIDTH="100%" NOSAVE >
<tr NOSAVE>
<td VALIGN=TOP NOSAVE>C and C++:</td>

<td WIDTH="85%">
typedef void <b>ZOLTAN_OBJ_SIZE_MULTI_FN</b> (
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void *<i>data</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_gid_entries</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_lid_entries</i>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_ids</i>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>global_ids</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>local_ids</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>*sizes</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>*ierr</i>);
</td>
</tr>

<tr NOSAVE>
<td VALIGN=TOP WIDTH="15%" NOSAVE>FORTRAN:</td>

<td>SUBROUTINE <b><i>Obj_Size_Multi</i></b>(<i>data, num_gid_entries,&nbsp; num_lid_entries</i>,
<i>num_ids, global_ids, local_ids, sizes, ierr</i>)&nbsp;
<br>&lt;<i>type-data</i>>, INTENT(IN) :: data&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN) :: num_gid_entries, num_lid_entries, num_ids
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: global_ids,&nbsp; local_ids
<br>INTEGER(Zoltan_INT), INTENT(OUT), DIMENSION(*) :: sizes&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(OUT) :: ierr&nbsp;
<p>&lt;<i>type-data</i>> can be any of INTEGER(Zoltan_INT), DIMENSION(*) or
REAL(Zoltan_FLOAT), DIMENSION(*) or REAL(Zoltan_DOUBLE), DIMENSION(*) or TYPE(Zoltan_User_Data_<i>x</i>)
where <i>x</i> is 1, 2, 3 or 4. See the section on
<a href="ug_fortran_api.html#fortran ug api query">Fortran
query functions</a> for an explanation.&nbsp;</td>
</tr>
</table>

<hr WIDTH="100%">A <b>ZOLTAN_OBJ_SIZE_MULTI_FN</b> 
query function is the multiple-ID
version of <a href="#ZOLTAN_OBJ_SIZE_FN"><b>ZOLTAN_OBJ_SIZE_FN</b></a>.  
For a list of objects, it returns the per-objects sizes
(in bytes) of the data buffers needed to pack object
data.
<br>&nbsp;
<table WIDTH="100%" NOSAVE >
<tr>
<td VALIGN=TOP WIDTH="20%"><b>Function Type:</b></td>

<td WIDTH="80%"><b>ZOLTAN_OBJ_SIZE_MULTI_FN_TYPE</b></td>
</tr>

<tr>
<td VALIGN=TOP><b>Arguments:</b></td>

<td></td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; data</i></td>

<td>Pointer to user-defined data.</td>
</tr>

<tr VALIGN=TOP NOSAVE>
<td>&nbsp;&nbsp; <i>num_gid_entries</i></td>

<td NOSAVE>The number of array entries used to describe a single global
ID.&nbsp; This value is the maximum value over all processors of the parameter
<a href="ug_param.html#NUM_GID_ENTRIES">NUM_GID_ENTRIES</a>.</td>
</tr>

<tr VALIGN=TOP NOSAVE>
<td><i>&nbsp;&nbsp; num_lid_entries</i></td>

<td NOSAVE>The number of array entries used to describe a single local
ID.&nbsp; This value is the maximum value over all processors of the parameter
<a href="ug_param.html#NUM_LID_ENTRIES">NUM_LID_ENTRIES</a>.</td>
</tr>

<tr VALIGN=TOP NOSAVE>
<td><i>&nbsp;&nbsp; num_ids</i></td>

<td NOSAVE>The number of objects whose sizes are to be returned.
</td>
</tr>
<tr>
<td>&nbsp;&nbsp; <i>global_ids</i></td>

<td>An array of global IDs of the objects.  The ID for the <i>i</i>-th 
object begins in <i>global_ids[i*num_gid_entries]</i>.</td>
</tr>

<tr>
<td>&nbsp;&nbsp; <i>local_ids</i></td>

<td>An array of local IDs of the objects.   The ID for the <i>i</i>-th 
object begins in <i>local_ids[i*num_lid_entries]</i>.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp; sizes</i></td>

<td>Upon return, array of sizes (in bytes) for each object in the ID lists.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; ierr</i></td>

<td>Error code to be set by function.</td>
</tr>

</table>

<p>
<!------------------------------------------------------------------------->
<hr WIDTH="100%">
<a NAME="ZOLTAN_PACK_OBJ_FN"></a>
<hr WIDTH="100%">
<table WIDTH="100%" NOSAVE >
<tr NOSAVE>
<td VALIGN=TOP NOSAVE>C and C++:</td>

<td WIDTH="85%">
typedef void <b>ZOLTAN_PACK_OBJ_FN</b> (
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void *<i>data</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_gid_entries</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_lid_entries</i>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>global_id</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>local_id</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>dest</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>size</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char *<i>buf</i>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int *<i>ierr</i>);
</td>
</tr>

<tr NOSAVE>
<td VALIGN=TOP WIDTH="15%" NOSAVE>FORTRAN:</td>

<td>SUBROUTINE <b><i>Pack_Obj</i></b>(<i>data, num_gid_entries, num_lid_entries,
global_id, local_id, dest, size, buf, ierr</i>)&nbsp;
<br>&lt;<i>type-data</i>>, INTENT(IN) :: data&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN) :: num_gid_entries, num_lid_entries&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: global_id&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: local_id&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN) :: dest, size&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(OUT), DIMENSION(*) :: buf&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(OUT) :: ierr&nbsp;
<p>&lt;<i>type-data</i>> can be any of INTEGER(Zoltan_INT), DIMENSION(*) or
REAL(Zoltan_FLOAT), DIMENSION(*) or REAL(Zoltan_DOUBLE), DIMENSION(*) or TYPE(Zoltan_User_Data_<i>x</i>)
where <i>x</i> is 1, 2, 3 or 4. See the section on
<a href="ug_fortran_api.html#fortran ug api query">Fortran
query functions</a> for an explanation.&nbsp;</td>
</tr>
</table>

<hr WIDTH="100%">A <b>ZOLTAN_PACK_OBJ_FN</b> query function allows the application
to tell Zoltan how to copy all needed data for a given
object into a communication buffer. The object's data can then be sent
to another processor as part of data migration. It may also perform other
operations, such as removing the object from the processor's data structure.
This routine is called by <b><a href="ug_interface_mig.html#Zoltan_Migrate">Zoltan_Migrate</a></b>
for each object to be sent to another processor.
<br>&nbsp;
<table WIDTH="100%" >
<tr>
<td VALIGN=TOP WIDTH="20%"><b>Function Type:</b></td>

<td WIDTH="80%"><b>ZOLTAN_PACK_OBJ_FN_TYPE</b></td>
</tr>

<tr>
<td VALIGN=TOP><b>Arguments:</b></td>

<td></td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; data</i></td>

<td>Pointer to user-defined data.</td>
</tr>

<tr NOSAVE>
<td VALIGN=TOP NOSAVE>&nbsp;&nbsp;&nbsp; <i>num_gid_entries</i></td>

<td>The number of array entries used to describe a single global ID.&nbsp;
This value is the maximum value over all processors of the parameter <a href="ug_param.html#NUM_GID_ENTRIES">NUM_GID_ENTRIES</a>.</td>
</tr>

<tr NOSAVE>
<td VALIGN=TOP NOSAVE>&nbsp;&nbsp;&nbsp; <i>num_lid_entries</i></td>

<td>The number of array entries used to describe a single local ID.&nbsp;
This value is the maximum value over all processors of the parameter <a href="ug_param.html#NUM_LID_ENTRIES">NUM_LID_ENTRIES</a>.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; global_id</i></td>

<td>The global ID of the object for which data should be copied into the
communication buffer.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; local_id</i></td>

<td>The local ID of the object for which data should be copied into the
communication buffer.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; dest</i></td>

<td>The destination part (i.e., the part to which the object
is being sent)</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; size</i></td>

<td>The size (in bytes) of the communication buffer for the specified object.
This value is at least as large as the value returned by 
the <b><a href="#ZOLTAN_OBJ_SIZE_MULTI_FN">ZOLTAN_OBJ_SIZE_MULTI_FN</a></b> or
<b><a href="#ZOLTAN_OBJ_SIZE_FN">ZOLTAN_OBJ_SIZE_FN</a></b>
query function; it may be slightly larger due to padding for data alignment
in the buffer.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; buf</i></td>

<td>The starting address of the communication buffer into which the object's
data should be packed.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; ierr</i></td>

<td>Error code to be set by function.</td>
</tr>
</table>

<p>

<!------------------------------------------------------------------------->
<hr WIDTH="100%">
<a NAME="ZOLTAN_PACK_OBJ_MULTI_FN"></a>
<hr WIDTH="100%">
<table WIDTH="100%" NOSAVE >
<tr NOSAVE>
<td VALIGN=TOP NOSAVE>C and C++:</td>

<td WIDTH="85%">
typedef void <b>ZOLTAN_PACK_OBJ_MULTI_FN</b> (
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void *<i>data</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_gid_entries</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_lid_entries</i>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_ids</i>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>global_ids</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>local_ids</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>*dest</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>*sizes</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>*idx</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char *<i>buf</i>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int *<i>ierr</i>);
</td>
</tr>

<tr NOSAVE>
<td VALIGN=TOP WIDTH="15%" NOSAVE>FORTRAN:</td>

<td>SUBROUTINE <b><i>Pack_Obj_Multi</i></b>(<i>data, num_gid_entries, num_lid_entries,
num_ids, global_ids, local_ids, dest, sizes, idx, buf, ierr</i>)&nbsp;
<br>&lt;<i>type-data</i>>, INTENT(IN) :: data&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN) :: num_gid_entries, num_lid_entries, num_ids&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: global_ids&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: local_ids&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: dest
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: sizes&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: idx&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(OUT), DIMENSION(*) :: buf&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(OUT) :: ierr&nbsp;
<p>&lt;<i>type-data</i>> can be any of INTEGER(Zoltan_INT), DIMENSION(*) or
REAL(Zoltan_FLOAT), DIMENSION(*) or REAL(Zoltan_DOUBLE), DIMENSION(*) or TYPE(Zoltan_User_Data_<i>x</i>)
where <i>x</i> is 1, 2, 3 or 4. See the section on
<a href="ug_fortran_api.html#fortran ug api query">Fortran
query functions</a> for an explanation.&nbsp;</td>
</tr>
</table>

<hr WIDTH="100%">A <b>ZOLTAN_PACK_OBJ_MULTI_FN</b> query function is the 
multiple-ID version of a
<a href="#ZOLTAN_PACK_OBJ_FN"><b>ZOLTAN_PACK_OBJ_FN</b></a>.  It allows the application
to tell Zoltan how to copy all needed data for a given list of 
objects into a communication buffer.
<br>&nbsp;
<table WIDTH="100%" >
<tr>
<td VALIGN=TOP WIDTH="20%"><b>Function Type:</b></td>

<td WIDTH="80%"><b>ZOLTAN_PACK_OBJ_FN_MULTI_TYPE</b></td>
</tr>

<tr>
<td VALIGN=TOP><b>Arguments:</b></td>

<td></td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; data</i></td>

<td>Pointer to user-defined data.</td>
</tr>

<tr NOSAVE>
<td VALIGN=TOP NOSAVE>&nbsp;&nbsp;&nbsp; <i>num_gid_entries</i></td>

<td>The number of array entries used to describe a single global ID.&nbsp;
This value is the maximum value over all processors of the parameter <a href="ug_param.html#NUM_GID_ENTRIES">NUM_GID_ENTRIES</a>.</td>
</tr>

<tr NOSAVE>
<td VALIGN=TOP NOSAVE>&nbsp;&nbsp;&nbsp; <i>num_lid_entries</i></td>

<td>The number of array entries used to describe a single local ID.&nbsp;
This value is the maximum value over all processors of the parameter <a href="ug_param.html#NUM_LID_ENTRIES">NUM_LID_ENTRIES</a>.</td>
</tr>

<tr VALIGN=TOP NOSAVE>
<td><i>&nbsp;&nbsp; num_ids</i></td>

<td NOSAVE>The number of objects to be packed.
</td>
</tr>
<tr>
<td>&nbsp;&nbsp; <i>global_ids</i></td>

<td>An array of global IDs of the objects.  The ID for the <i>i</i>-th 
object begins in <i>global_ids[i*num_gid_entries]</i>.</td>
</tr>

<tr>
<td>&nbsp;&nbsp; <i>local_ids</i></td>

<td>An array of local IDs of the objects.   The ID for the <i>i</i>-th 
object begins in <i>local_ids[i*num_lid_entries]</i>.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; dest</i></td>

<td>An array of destination part numbers (i.e., the parts to which the objects
are being sent)</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; sizes</i></td>

<td>An array containing the per-object sizes (in bytes) of the communication 
buffer for each object. Each value is at least as large as the corresponding
value returned by 
the <b><a href="#ZOLTAN_OBJ_SIZE_MULTI_FN">ZOLTAN_OBJ_SIZE_MULTI_FN</a></b>
or <b><a href="#ZOLTAN_OBJ_SIZE_FN">ZOLTAN_OBJ_SIZE_FN</a></b>
query function; it may be slightly larger due to padding for data alignment
in the buffer.
</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; idx</i></td>

<td>For each object, an index into the <i>buf</i> array giving the starting
location of that object's data.
 Data for the <i>i</i>-th object are stored in
                              <i>buf[idx[i]],
                                buf[idx[i]+1], ...,
                                buf[idx[i]+sizes[i]-1]</i>.
Because Zoltan adds some tag information
   to packed data, <i>idx[i]</i>&nbsp; !=&nbsp; sum[<i>j</i>=0,<i>i</i>-1](<i>sizes[j]</i>).

</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; buf</i></td>

<td>The address of the communication buffer into which the objects'
data should be packed.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; ierr</i></td>

<td>Error code to be set by function.</td>
</tr>
</table>

<p>

<!------------------------------------------------------------------------->
<hr WIDTH="100%">
<a NAME="ZOLTAN_UNPACK_OBJ_FN"></a>
<hr WIDTH="100%">
<table WIDTH="100%" NOSAVE >
<tr NOSAVE>
<td VALIGN=TOP NOSAVE>C and C++:</td>

<td WIDTH="85%">
typedef void <b>ZOLTAN_UNPACK_OBJ_FN</b>
(
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void *<i>data</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_gid_entries</i>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>global_id</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>size</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char *<i>buf</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int *<i>ierr</i>);
</td>
</tr>

<tr NOSAVE>
<td VALIGN=TOP WIDTH="15%" NOSAVE>FORTRAN:</td>

<td>SUBROUTINE <b><i>Unpack_Obj</i></b>(<i>data, num_gid_entries, global_id,
size, buf, ierr</i>)&nbsp;
<br>&lt;<i>type-data</i>>, INTENT(INOUT) :: data&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN) :: num_gid_entries&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: global_id&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN) :: size&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: buf&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(OUT) :: ierr&nbsp;
<p>&lt;<i>type-data</i>> can be any of INTEGER(Zoltan_INT), DIMENSION(*) or
REAL(Zoltan_FLOAT), DIMENSION(*) or REAL(Zoltan_DOUBLE), DIMENSION(*) or TYPE(Zoltan_User_Data_<i>x</i>)
where <i>x</i> is 1, 2, 3 or 4. See the section on
<a href="ug_fortran_api.html#fortran ug api query">Fortran
query functions</a> for an explanation.&nbsp;</td>
</tr>
</table>

<hr WIDTH="100%">A <b>ZOLTAN_UNPACK_OBJ_FN</b> query function allows the application
to tell Zoltan how to copy all needed data for a given
object from a communication buffer into the application's data structure.
This operation is needed as the final step of importing objects during
data migration. The query function may also perform other computation,
such as building request lists for related data. This routine is called
by <b><a href="ug_interface_mig.html#Zoltan_Migrate">Zoltan_Migrate</a></b>
for each object to be received by the processor. (Note: a local ID for
the object is not included in this function, as the local ID is local to
the exporting, not the importing, processor.)
<br>&nbsp;
<table WIDTH="100%" >
<tr>
<td VALIGN=TOP WIDTH="20%"><b>Function Type:</b></td>

<td WIDTH="80%"><b>ZOLTAN_UNPACK_OBJ_FN_TYPE</b></td>
</tr>

<tr>
<td VALIGN=TOP><b>Arguments:</b></td>

<td></td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; data</i></td>

<td>Pointer to user-defined data.</td>
</tr>

<tr NOSAVE>
<td VALIGN=TOP NOSAVE>&nbsp;&nbsp;&nbsp; <i>num_gid_entries</i></td>

<td>The number of array entries used to describe a single global ID.&nbsp;
This value is the maximum value over all processors of the parameter <a href="ug_param.html#NUM_GID_ENTRIES">NUM_GID_ENTRIES</a>.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; global_id</i></td>

<td>The global ID of the object whose data has been received in the communication
buffer.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; size</i></td>

<td>The size (in bytes) of the object's data in the communication buffer.
This value is at least as large as the value returned by 
the <b><a href="#ZOLTAN_OBJ_SIZE_MULTI_FN">ZOLTAN_OBJ_SIZE_MULTI_FN</a></b> or
<b><a href="#ZOLTAN_OBJ_SIZE_FN">ZOLTAN_OBJ_SIZE_FN</a></b>
query function; it may be slightly larger due to padding for data alignment
in the buffer.
</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; buf</i></td>

<td>The starting address of the communication buffer for this object.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; ierr</i></td>

<td>Error code to be set by function.</td>
</tr>
</table>
<p>

<!------------------------------------------------------------------------->
<hr WIDTH="100%">
<a NAME="ZOLTAN_UNPACK_OBJ_MULTI_FN"></a>
<hr WIDTH="100%">
<table WIDTH="100%" NOSAVE >
<tr NOSAVE>
<td VALIGN=TOP NOSAVE>C and C++:</td>

<td WIDTH="85%">
typedef void <b>ZOLTAN_UNPACK_OBJ_MULTI_FN</b>
(
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void *<i>data</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_gid_entries</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_ids</i>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>global_ids</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>*sizes</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>*idx</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char *<i>buf</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int *<i>ierr</i>);
</td>
</tr>

<tr NOSAVE>
<td VALIGN=TOP WIDTH="15%" NOSAVE>FORTRAN:</td>

<td>SUBROUTINE <b><i>Unpack_Obj_Multi</i></b>(<i>data, num_gid_entries, num_ids, global_ids, 
sizes, idx, buf, ierr</i>)&nbsp;
<br>&lt;<i>type-data</i>>, INTENT(INOUT) :: data&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN) :: num_gid_entries&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN) :: num_ids&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: global_ids
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: sizes&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: idx&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: buf&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(OUT) :: ierr&nbsp;
<p>&lt;<i>type-data</i>> can be any of INTEGER(Zoltan_INT), DIMENSION(*) or
REAL(Zoltan_FLOAT), DIMENSION(*) or REAL(Zoltan_DOUBLE), DIMENSION(*) or TYPE(Zoltan_User_Data_<i>x</i>)
where <i>x</i> is 1, 2, 3 or 4. See the section on
<a href="ug_fortran_api.html#fortran ug api query">Fortran
query functions</a> for an explanation.&nbsp;</td>
</tr>
</table>

<hr WIDTH="100%">A <b>ZOLTAN_UNPACK_OBJ_MULTI_FN</b> query function is the
multiple-ID version of a
<a href="#ZOLTAN_UNPACK_OBJ_FN"><b>ZOLTAN_UNPACK_OBJ_FN</b></a>.
It allows the application
to tell Zoltan how to copy all needed data for a given list of
objects from a communication buffer into the application's data structure.
<br>&nbsp;
<table WIDTH="100%" >
<tr>
<td VALIGN=TOP WIDTH="20%"><b>Function Type:</b></td>

<td WIDTH="80%"><b>ZOLTAN_UNPACK_OBJ_MULTI_FN_TYPE</b></td>
</tr>

<tr>
<td VALIGN=TOP><b>Arguments:</b></td>

<td></td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; data</i></td>

<td>Pointer to user-defined data.</td>
</tr>

<tr NOSAVE>
<td VALIGN=TOP NOSAVE>&nbsp;&nbsp;&nbsp; <i>num_gid_entries</i></td>

<td>The number of array entries used to describe a single global ID.&nbsp;
This value is the maximum value over all processors of the parameter <a href="ug_param.html#NUM_GID_ENTRIES">NUM_GID_ENTRIES</a>.</td>
</tr>

<tr VALIGN=TOP NOSAVE>
<td><i>&nbsp;&nbsp; num_ids</i></td>

<td NOSAVE>The number of objects to be unpacked.
</td>
</tr>
<tr>
<td>&nbsp;&nbsp; <i>global_ids</i></td>

<td>An array of global IDs of the objects.  The ID for the <i>i</i>-th 
object begins in <i>global_ids[i*num_gid_entries]</i>.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; sizes</i></td>

<td>An array containing the per-object sizes (in bytes) of the communication buffer for each object.
Each value is at least as large as the corresponding value returned by 
the <b><a href="#ZOLTAN_OBJ_SIZE_MULTI_FN">ZOLTAN_OBJ_SIZE_MULTI_FN</a></b> or
<b><a href="#ZOLTAN_OBJ_SIZE_FN">ZOLTAN_OBJ_SIZE_FN</a></b>
query function; it may be slightly larger due to padding for data alignment
in the buffer.
</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; idx</i></td>

<td>For each object, an index into the <i>buf</i> array giving the starting
location of that object's data.
 Data for the <i>i</i>-th object are stored in
                              <i>buf[idx[i]],
                                buf[idx[i]+1], ...,
                                buf[idx[i]+sizes[i]-1]</i>.
Because Zoltan adds some tag information
   to packed data, <i>idx[i]</i>&nbsp; !=&nbsp; sum[<i>j</i>=0,<i>i</i>-1](<i>sizes[j]</i>).

</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; buf</i></td>

<td>The address of the communication buffer from which data is unpacked.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; ierr</i></td>

<td>Error code to be set by function.</td>
</tr>
</table>
<p>

<!------------------------------------------------------------------------->
<hr WIDTH="100%">
<a NAME="ZOLTAN_PRE_MIGRATE_PP_FN"></a>
<hr WIDTH="100%">
<table WIDTH="100%" NOSAVE >
<tr NOSAVE>
<td VALIGN=TOP NOSAVE>C and C++:</td>

<td WIDTH="85%">
typedef void <b>ZOLTAN_PRE_MIGRATE_PP_FN</b>
(
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void *<i>data</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_gid_entries</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_lid_entries</i>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_import</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>import_global_ids</i>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>import_local_ids</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int *<i>import_procs</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int *<i>import_to_part</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_export</i>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>export_global_ids</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>export_local_ids</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int *<i>export_procs</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int *<i>export_to_part</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int *<i>ierr</i>);
</td>
</tr>

<tr NOSAVE>
<td VALIGN=TOP WIDTH="15%" NOSAVE>FORTRAN:</td>

<td>SUBROUTINE <b><i>Pre_Migrate_PP</i></b>(<i>data, num_gid_entries, num_lid_entries,
num_import, import_global_ids, import_local_ids, import_procs, import_to_part, num_export,
export_global_ids, export_local_ids, export_procs, export_to_part, ierr</i>)&nbsp;
<br>&lt;<i>type-data</i>>, INTENT(INOUT) :: data&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN) :: num_gid_entries, num_lid_entries&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN) :: num_import, num_export&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: import_global_ids, export_global_ids&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: import_local_ids, export_local_ids&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: import_procs, export_procs&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: import_to_part, export_to_part&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(OUT) :: ierr&nbsp;
<p>&lt;<i>type-data</i>> can be any of INTEGER(Zoltan_INT), DIMENSION(*) or
REAL(Zoltan_FLOAT), DIMENSION(*) or REAL(Zoltan_DOUBLE), DIMENSION(*) or TYPE(Zoltan_User_Data_<i>x</i>)
where <i>x</i> is 1, 2, 3 or 4. See the section on
<a href="ug_fortran_api.html#fortran ug api query">Fortran
query functions</a> for an explanation.&nbsp;</td>
</tr>
</table>

<hr WIDTH="100%">A <b>ZOLTAN_PRE_MIGRATE_PP_FN</b> query function performs any
pre-processing desired by the application. If it is registered, it is called
at the beginning of the <b><a href="ug_interface_mig.html#Zoltan_Migrate">Zoltan_Migrate</a></b>
routine. The arguments passed to <b><a href="ug_interface_mig.html#Zoltan_Migrate">Zoltan_Migrate</a></b>
are made available for use in the pre-processing routine.
<br>&nbsp;
<table WIDTH="100%" >
<tr>
<td VALIGN=TOP WIDTH="20%"><b>Function Type:</b></td>

<td WIDTH="80%"><b>ZOLTAN_PRE_MIGRATE_PP_FN_TYPE</b></td>
</tr>

<tr>
<td VALIGN=TOP><b>Arguments:</b></td>

<td></td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; data</i></td>

<td>Pointer to user-defined data.</td>
</tr>

<tr NOSAVE>
<td VALIGN=TOP NOSAVE>&nbsp;&nbsp;&nbsp; <i>num_gid_entries</i></td>

<td>The number of array entries used to describe a single global ID.&nbsp;
This value is the maximum value over all processors of the parameter <a href="ug_param.html#NUM_GID_ENTRIES">NUM_GID_ENTRIES</a>.</td>
</tr>

<tr NOSAVE>
<td VALIGN=TOP NOSAVE>&nbsp;&nbsp;&nbsp; <i>num_lid_entries</i></td>

<td>The number of array entries used to describe a single local ID.&nbsp;
This value is the maximum value over all processors of the parameter <a href="ug_param.html#NUM_LID_ENTRIES">NUM_LID_ENTRIES</a>.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; num_import</i></td>

<td>The number of objects that will be received by this processor.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; import_global_ids</i></td>

<td>An array of <i>num_import</i> global IDs of objects
to be received by this processor. This array may be NULL, as the processor
does not necessarily need to know which objects it will receive.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; import_local_ids</i></td>

<td>An array of <i>num_import</i> local IDs of objects
to be received by this processor. This array may be NULL, as the processor
does not necessarily need to know which objects it will receive.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; import_procs</i></td>

<td>An array of size <i>num_import</i> listing the processor IDs of the
source processors. This array may be NULL, as the processor does not necessarily
need to know which objects is will receive.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; import_to_part</i></td>

<td>An array of size <i>num_import</i> listing the parts to which
objects will be imported.
This array may be NULL, as the processor does not necessarily
need to know from which objects it will receive.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; num_export</i></td>

<td>The number of objects that will be sent from this processor to other
processors.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; export_global_ids</i></td>

<td>An array of <i>num_export</i> global IDs of objects
to be sent from this processor.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; export_local_ids</i></td>

<td>An array of <i>num_export</i> local IDs of objects
to be sent from this processor.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; export_procs</i></td>

<td>An array of size <i>num_export</i> listing the processor IDs of the
destination processors.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; export_to_part</i></td>

<td>An array of size <i>num_export</i> listing the parts to which
objects will be sent. </td>
</tr>
<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; ierr</i></td>

<td>Error code to be set by function.</td>
</tr>

<tr>
<td VALIGN=TOP><b>Default:</b></td>

<td></td>
</tr>

<tr>
<td VALIGN=TOP></td>

<td>No pre-processing is done if a <b>ZOLTAN_PRE_MIGRATE_PP_FN</b> is not registered.</td>
</tr>
</table>

<p>

<!------------------------------------------------------------------------->
<hr WIDTH="100%">
<a NAME="ZOLTAN_MID_MIGRATE_PP_FN"></a>
<hr WIDTH="100%">
<table WIDTH="100%" NOSAVE >
<tr NOSAVE>
<td VALIGN=TOP NOSAVE>C and C++:</td>

<td WIDTH="85%">
typedef void <b>ZOLTAN_MID_MIGRATE_PP_FN</b> (
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void *<i>data</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_gid_entries</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_lid_entries</i>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_import</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>import_global_ids</i>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>import_local_ids</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int *<i>import_procs</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int *<i>import_to_part</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_export</i>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>export_global_ids</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>export_local_ids</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int *<i>export_procs</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int *<i>export_to_part</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int *<i>ierr</i>);
</td>
</tr>

<tr NOSAVE>
<td VALIGN=TOP WIDTH="15%" NOSAVE>FORTRAN:</td>

<td>SUBROUTINE <b><i>Mid_Migrate_PP</i></b>(<i>data, num_gid_entries, num_lid_entries,
num_import, import_global_ids, import_local_ids, import_procs, import_to_part, num_export,
export_global_ids, export_local_ids, export_procs, export_to_part, ierr</i>)&nbsp;
<br>&lt;<i>type-data</i>>, INTENT(INOUT) :: data&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN) :: num_gid_entries, num_lid_entries&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN) :: num_import, num_export&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: import_global_ids, export_global_ids&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: import_local_ids, export_local_ids&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: import_procs, export_procs&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: import_to_part, export_to_part&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(OUT) :: ierr&nbsp;
<p>&lt;<i>type-data</i>> can be any of INTEGER(Zoltan_INT), DIMENSION(*) or
REAL(Zoltan_FLOAT), DIMENSION(*) or REAL(Zoltan_DOUBLE), DIMENSION(*) or TYPE(Zoltan_User_Data_<i>x</i>)
where <i>x</i> is 1, 2, 3 or 4. See the section on
<a href="ug_fortran_api.html#fortran ug api query">Fortran
query functions</a> for an explanation.&nbsp;</td>
</tr>
</table>

<hr WIDTH="100%">A <b>ZOLTAN_MID_MIGRATE_PP_FN</b> query function performs any
processing desired by the application between the packing and unpacking
of objects being migrated. If it is registered, it is called after export
objects are packed in <b><a href="ug_interface_mig.html#Zoltan_Migrate">Zoltan_Migrate</a></b>;
imported objects are unpacked after the <b>ZOLTAN_MID_MIGRATE_PP_FN</b> query
function is called. The arguments passed to <b><a href="ug_interface_mig.html#Zoltan_Migrate">Zoltan_Migrate</a></b>
are made available for use in the processing routine.
<br>&nbsp;
<table WIDTH="100%" >
<caption>,&nbsp;</caption>

<tr>
<td VALIGN=TOP WIDTH="20%"><b>Function Type:</b></td>

<td WIDTH="80%"><b>ZOLTAN_MID_MIGRATE_PP_FN_TYPE</b></td>
</tr>

<tr>
<td VALIGN=TOP><b>Arguments:</b></td>

<td></td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; data</i></td>

<td>Pointer to user-defined data.</td>
</tr>

<tr NOSAVE>
<td VALIGN=TOP NOSAVE>&nbsp;&nbsp;&nbsp; <i>num_gid_entries</i></td>

<td>The number of array entries used to describe a single global ID.&nbsp;
This value is the maximum value over all processors of the parameter <a href="ug_param.html#NUM_GID_ENTRIES">NUM_GID_ENTRIES</a>.</td>
</tr>

<tr NOSAVE>
<td VALIGN=TOP NOSAVE>&nbsp;&nbsp;&nbsp; <i>num_lid_entries</i></td>

<td>The number of array entries used to describe a single local ID.&nbsp;
This value is the maximum value over all processors of the parameter <a href="ug_param.html#NUM_LID_ENTRIES">NUM_LID_ENTRIES</a>.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; num_import</i></td>

<td>The number of objects that will be received by this processor.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; import_global_ids</i></td>

<td>An array of <i>num_import</i> global IDs of objects
to be received by this processor. This array may be NULL, as the processor
does not necessarily need to know which objects it will receive.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; import_local_ids</i></td>

<td>An array of <i>num_import</i> local IDs of objects
to be received by this processor. This array may be NULL, as the processor
does not necessarily need to know which objects it will receive.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; import_procs</i></td>

<td>An array of size <i>num_import</i> listing the processor IDs of the
source processors. This array may be NULL, as the processor does not necessarily
need to know which objects is will receive.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; import_to_part</i></td>

<td>An array of size <i>num_import</i> listing the parts to which
objects will be imported.
This array may be NULL, as the processor does not necessarily
need to know from which objects it will receive.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; num_export</i></td>

<td>The number of objects that will be sent from this processor to other
processors.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; export_global_ids</i></td>

<td>An array of <i>num_export</i> global IDs of objects
to be sent from this processor.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; export_local_ids</i></td>

<td>An array of <i>num_export</i> local IDs of objects
to be sent from this processor.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; export_procs</i></td>

<td>An array of size <i>num_export</i> listing the processor IDs of the
destination processors.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; export_to_part</i></td>

<td>An array of size <i>num_export</i> listing the parts to which
objects will be sent. </td>
</tr>
<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; ierr</i></td>

<td>Error code to be set by function.</td>
</tr>

<tr>
<td VALIGN=TOP><b>Default:</b></td>

<td></td>
</tr>

<tr>
<td VALIGN=TOP></td>

<td>No processing is done if a <b>ZOLTAN_MID_MIGRATE_PP_FN</b> is not registered.</td>
</tr>
</table>

<p>

<!------------------------------------------------------------------------->
<hr WIDTH="100%">
<a NAME="ZOLTAN_POST_MIGRATE_PP_FN"></a>
<hr WIDTH="100%">
<table WIDTH="100%" NOSAVE >
<tr NOSAVE>
<td VALIGN=TOP NOSAVE>C and C++:</td>

<td WIDTH="85%">
typedef void <b>ZOLTAN_POST_MIGRATE_PP_FN</b> (
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void *<i>data</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_gid_entries</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_lid_entries</i>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_import</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>import_global_ids</i>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>import_local_ids</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int *<i>import_procs</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int *<i>import_to_part</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_export</i>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>export_global_ids</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>export_local_ids</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int *<i>export_procs</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int *<i>export_to_part</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int *<i>ierr</i>);
</td>
</tr>

<tr NOSAVE>
<td VALIGN=TOP WIDTH="15%" NOSAVE>FORTRAN:</td>

<td>SUBROUTINE <b><i>Post_Migrate_PP</i></b>(<i>data, num_gid_entries, num_lid_entries,
num_import, import_global_ids, import_local_ids, import_procs, import_to_part, num_export,
export_global_ids, export_local_ids, export_procs, export_to_part, ierr</i>)&nbsp;
<br>&lt;<i>type-data</i>>, INTENT(INOUT) :: data&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN) :: num_gid_entries, num_lid_entries&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN) :: num_import, num_export&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: import_global_ids, export_global_ids&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: import_local_ids, export_local_ids&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: import_procs, export_procs&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: import_to_part, export_to_part&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(OUT) :: ierr&nbsp;
<p>&lt;<i>type-data</i>> can be any of INTEGER(Zoltan_INT), DIMENSION(*) or
REAL(Zoltan_FLOAT), DIMENSION(*) or REAL(Zoltan_DOUBLE), DIMENSION(*) or TYPE(Zoltan_User_Data_<i>x</i>)
where <i>x</i> is 1, 2, 3 or 4. See the section on
<a href="ug_fortran_api.html#fortran ug api query">Fortran
query functions</a> for an explanation.&nbsp;</td>
</tr>
</table>

<hr WIDTH="100%">A <b>ZOLTAN_POST_MIGRATE_PP_FN</b> query function performs any
post-processing desired by the application. If it is registered, it is
called at the end of the <b><a href="ug_interface_mig.html#Zoltan_Migrate">Zoltan_Migrate</a></b>
routine. The arguments passed to <b><a href="ug_interface_mig.html#Zoltan_Migrate">Zoltan_Migrate</a></b>
are made available for use in the post-processing routine.
<br>&nbsp;
<table WIDTH="100%" >
<tr>
<td VALIGN=TOP WIDTH="20%"><b>Function Type:</b></td>

<td WIDTH="80%"><b>ZOLTAN_POST_MIGRATE_PP_FN_TYPE</b></td>
</tr>

<tr>
<td VALIGN=TOP><b>Arguments:</b></td>

<td></td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; data</i></td>

<td>Pointer to user-defined data.</td>
</tr>

<tr NOSAVE>
<td VALIGN=TOP NOSAVE>&nbsp;&nbsp;&nbsp; <i>num_gid_entries</i></td>

<td>The number of array entries used to describe a single global ID.&nbsp;
This value is the maximum value over all processors of the parameter <a href="ug_param.html#NUM_GID_ENTRIES">NUM_GID_ENTRIES</a>.</td>
</tr>

<tr NOSAVE>
<td VALIGN=TOP NOSAVE>&nbsp;&nbsp;&nbsp; <i>num_lid_entries</i></td>

<td>The number of array entries used to describe a single local ID.&nbsp;
This value is the maximum value over all processors of the parameter <a href="ug_param.html#NUM_LID_ENTRIES">NUM_LID_ENTRIES</a>.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; num_import</i></td>

<td>The number of objects that will be received by this processor.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; import_global_ids</i></td>

<td>An array of <i>num_import</i> global IDs of objects
to be received by this processor. This array may be NULL, as the processor
does not necessarily need to know which objects it will receive.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; import_local_ids</i></td>

<td>An array of <i>num_import</i> local IDs of objects
to be received by this processor. This array may be NULL, as the processor
does not necessarily need to know which objects it will receive.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; import_procs</i></td>

<td>An array of size <i>num_import</i> listing the processor IDs of the
source processors. This array may be NULL, as the processor does not necessarily
need to know which objects is will receive.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; import_to_part</i></td>

<td>An array of size <i>num_import</i> listing the parts to which
objects will be imported.
This array may be NULL, as the processor does not necessarily
need to know from which objects it will receive.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; num_export</i></td>

<td>The number of objects that will be sent from this processor to other
processors.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; export_global_ids</i></td>

<td>An array of <i>num_export</i> global IDs of objects
to be sent from this processor.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; export_local_ids</i></td>

<td>An array of <i>num_export</i> local IDs of objects
to be sent from this processor.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; export_procs</i></td>

<td>An array of size <i>num_export</i> listing the processor IDs of the
destination processors.</td>
</tr>

<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; export_to_part</i></td>

<td>An array of size <i>num_export</i> listing the parts to which
objects will be sent. </td>
</tr>
<tr>
<td VALIGN=TOP><i>&nbsp;&nbsp;&nbsp; ierr</i></td>

<td>Error code to be set by function.</td>
</tr>

<tr>
<td VALIGN=TOP><b>Default:</b></td>

<td></td>
</tr>

<tr>
<td VALIGN=TOP></td>

<td>No post-processing is done if a <b>ZOLTAN_POST_MIGRATE_PP_FN</b> is not registered.</td>
</tr>
</table>

<!------------------------------------------------------------------------->
<hr WIDTH="100%">
<a NAME="ZOLTAN_PRE_MIGRATE_FN"></a>
<hr WIDTH="100%">
<table WIDTH="100%" NOSAVE >
<tr NOSAVE>
<td VALIGN=TOP NOSAVE>C:</td>

<td WIDTH="85%">
typedef void <b>ZOLTAN_PRE_MIGRATE_FN</b>
(
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void *<i>data</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_gid_entries</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_lid_entries</i>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_import</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>import_global_ids</i>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>import_local_ids</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int *<i>import_procs</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_export</i>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>export_global_ids</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>export_local_ids</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int *<i>export_procs</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int *<i>ierr</i>);
</td>
</tr>

<tr NOSAVE>
<td VALIGN=TOP WIDTH="15%" NOSAVE>FORTRAN:</td>

<td>SUBROUTINE <b><i>Pre_Migrate</i></b>(<i>data, num_gid_entries, num_lid_entries,
num_import, import_global_ids, import_local_ids, import_procs, num_export,
export_global_ids, export_local_ids, export_procs, ierr</i>)&nbsp;
<br>&lt;<i>type-data</i>>, INTENT(INOUT) :: data&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN) :: num_gid_entries, num_lid_entries&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN) :: num_import, num_export&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: import_global_ids, export_global_ids&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: import_local_ids, export_local_ids&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: import_procs, export_procs&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(OUT) :: ierr&nbsp;
<p>&lt;<i>type-data</i>> can be any of INTEGER(Zoltan_INT), DIMENSION(*) or
REAL(Zoltan_FLOAT), DIMENSION(*) or REAL(Zoltan_DOUBLE), DIMENSION(*) or TYPE(Zoltan_User_Data_<i>x</i>)
where <i>x</i> is 1, 2, 3 or 4. See the section on
<a href="ug_fortran_api.html#fortran ug api query">Fortran
query functions</a> for an explanation.&nbsp;</td>
</tr>
</table>

<hr WIDTH="100%">A <b>ZOLTAN_PRE_MIGRATE_FN</b> query function performs any
pre-processing desired by applications using 
<b><a href="ug_interface_mig.html#Zoltan_Help_Migrate">Zoltan_Help_Migrate</a></b>.
Its function is analogous to 
<b><a href="#ZOLTAN_PRE_MIGRATE_PP_FN">ZOLTAN_PRE_MIGRATE_PP_FN</a></b>, but
it cannot be used with <a href="ug_interface_mig.html#Zoltan_Migrate"><b>Zoltan_Migrate</b></a>.
<br>&nbsp;
<table WIDTH="100%" >
<tr>
<td VALIGN=TOP WIDTH="20%"><b>Function Type:</b></td>

<td WIDTH="80%"><b>ZOLTAN_PRE_MIGRATE_FN_TYPE</b></td>
</tr>

<tr>
<td VALIGN=TOP><b>Arguments:</b></td>

<td></td>
</tr>

<tr>
<td VALIGN=TOP></td>

<td>
All arguments are analogous to those in
<a href="#ZOLTAN_PRE_MIGRATE_PP_FN"><b>ZOLTAN_PRE_MIGRATE_PP_FN</b></a>.
Part-assignment arguments <i>import_to_part</i> and <i>export_to_part</i>
are not included, as processor and parts
numbers are considered to be the same in 
<a href="ug_interface_mig.html#Zoltan_Help_Migrate"><b>Zoltan_Help_Migrate</b></a>.
</td>
</tr>

<tr>
<td VALIGN=TOP><b>Default:</b></td>

<td></td>
</tr>

<tr>
<td VALIGN=TOP></td>

<td>No pre-processing is done if a <b>ZOLTAN_PRE_MIGRATE_FN</b> is not registered.</td>
</tr>
</table>

<p>

<!------------------------------------------------------------------------->
<hr WIDTH="100%">
<a NAME="ZOLTAN_MID_MIGRATE_FN"></a>
<hr WIDTH="100%">
<table WIDTH="100%" NOSAVE >
<tr NOSAVE>
<td VALIGN=TOP NOSAVE>C:</td>

<td WIDTH="85%">
typedef void <b>ZOLTAN_MID_MIGRATE_FN</b> (
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void *<i>data</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_gid_entries</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_lid_entries</i>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_import</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>import_global_ids</i>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>import_local_ids</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int *<i>import_procs</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_export</i>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>export_global_ids</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>export_local_ids</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int *<i>export_procs</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int *<i>ierr</i>);
</td>
</tr>

<tr NOSAVE>
<td VALIGN=TOP WIDTH="15%" NOSAVE>FORTRAN:</td>

<td>SUBROUTINE <b><i>Mid_Migrate</i></b>(<i>data, num_gid_entries, num_lid_entries,
num_import, import_global_ids, import_local_ids, import_procs, num_export,
export_global_ids, export_local_ids, export_procs, ierr</i>)&nbsp;
<br>&lt;<i>type-data</i>>, INTENT(INOUT) :: data&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN) :: num_gid_entries, num_lid_entries&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN) :: num_import, num_export&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: import_global_ids, export_global_ids&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: import_local_ids, export_local_ids&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: import_procs, export_procs&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(OUT) :: ierr&nbsp;
<p>&lt;<i>type-data</i>> can be any of INTEGER(Zoltan_INT), DIMENSION(*) or
REAL(Zoltan_FLOAT), DIMENSION(*) or REAL(Zoltan_DOUBLE), DIMENSION(*) or TYPE(Zoltan_User_Data_<i>x</i>)
where <i>x</i> is 1, 2, 3 or 4. See the section on
<a href="ug_fortran_api.html#fortran ug api query">Fortran
query functions</a> for an explanation.&nbsp;</td>
</tr>
</table>

<hr WIDTH="100%">A <b>ZOLTAN_MID_MIGRATE_FN</b> query function performs any
mid-migration processing desired by applications using 
<b><a href="ug_interface_mig.html#Zoltan_Help_Migrate">Zoltan_Help_Migrate</a></b>.
Its function is analogous to 
<b><a href="#ZOLTAN_MID_MIGRATE_PP_FN">ZOLTAN_MID_MIGRATE_PP_FN</a></b>, but
it cannot be used with <a href="ug_interface_mig.html#Zoltan_Migrate"><b>Zoltan_Migrate</b></a>.
<br>&nbsp;
<table WIDTH="100%" >
<tr>
<td VALIGN=TOP WIDTH="20%"><b>Function Type:</b></td>

<td WIDTH="80%"><b>ZOLTAN_MID_MIGRATE_FN_TYPE</b></td>
</tr>

<tr>
<td VALIGN=TOP><b>Arguments:</b></td>

<td></td>
</tr>

<tr>
<td VALIGN=TOP></td>

<td>
All arguments are analogous to those in
<a href="#ZOLTAN_MID_MIGRATE_PP_FN"><b>ZOLTAN_MID_MIGRATE_PP_FN</b></a>.
Part-assignment arguments <i>import_to_part</i> and <i>export_to_part</i>
are not included, as processor and parts
numbers are considered to be the same in 
<a href="ug_interface_mig.html#Zoltan_Help_Migrate"><b>Zoltan_Help_Migrate</b></a>.
</td>
</tr>

<tr>
<td VALIGN=TOP><b>Default:</b></td>

<td></td>
</tr>

<tr>
<td VALIGN=TOP></td>

<td>No processing is done if a <b>ZOLTAN_MID_MIGRATE_FN</b> is not registered.</td>
</tr>
</table>

<p>

<!------------------------------------------------------------------------->
<hr WIDTH="100%">
<a NAME="ZOLTAN_POST_MIGRATE_FN"></a>
<hr WIDTH="100%">
<table WIDTH="100%" NOSAVE >
<tr NOSAVE>
<td VALIGN=TOP NOSAVE>C:</td>

<td WIDTH="85%">
typedef void <b>ZOLTAN_POST_MIGRATE_FN</b> (
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void *<i>data</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_gid_entries</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_lid_entries</i>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_import</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>import_global_ids</i>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>import_local_ids</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int *<i>import_procs</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int <i>num_export</i>,
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>export_global_ids</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="ug_usage.html#Data Types for Object IDs">ZOLTAN_ID_PTR</a></b> <i>export_local_ids</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int *<i>export_procs</i>, 
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int *<i>ierr</i>);
</td>
</tr>

<tr NOSAVE>
<td VALIGN=TOP WIDTH="15%" NOSAVE>FORTRAN:</td>

<td>SUBROUTINE <b><i>Post_Migrate</i></b>(<i>data, num_gid_entries, num_lid_entries,
num_import, import_global_ids, import_local_ids, import_procs, num_export,
export_global_ids, export_local_ids, export_procs, ierr</i>)&nbsp;
<br>&lt;<i>type-data</i>>, INTENT(INOUT) :: data&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN) :: num_gid_entries, num_lid_entries&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN) :: num_import, num_export&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: import_global_ids, export_global_ids&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: import_local_ids, export_local_ids&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(IN), DIMENSION(*) :: import_procs, export_procs&nbsp;
<br>INTEGER(Zoltan_INT), INTENT(OUT) :: ierr&nbsp;
<p>&lt;<i>type-data</i>> can be any of INTEGER(Zoltan_INT), DIMENSION(*) or
REAL(Zoltan_FLOAT), DIMENSION(*) or REAL(Zoltan_DOUBLE), DIMENSION(*) or TYPE(Zoltan_User_Data_<i>x</i>)
where <i>x</i> is 1, 2, 3 or 4. See the section on
<a href="ug_fortran_api.html#fortran ug api query">Fortran
query functions</a> for an explanation.&nbsp;</td>
</tr>
</table>

<hr WIDTH="100%">A <b>ZOLTAN_POST_MIGRATE_FN</b> query function performs any
post-processing desired by applications using 
<b><a href="ug_interface_mig.html#Zoltan_Help_Migrate">Zoltan_Help_Migrate</a></b>.
Its function is analogous to 
<b><a href="#ZOLTAN_POST_MIGRATE_PP_FN">ZOLTAN_POST_MIGRATE_PP_FN</a></b>, but
it cannot be used with <a href="ug_interface_mig.html#Zoltan_Migrate"><b>Zoltan_Migrate</b></a>.
<br>&nbsp;
<table WIDTH="100%" >
<tr>
<td VALIGN=TOP WIDTH="20%"><b>Function Type:</b></td>

<td WIDTH="80%"><b>ZOLTAN_POST_MIGRATE_FN_TYPE</b></td>
</tr>

<tr>
<td VALIGN=TOP><b>Arguments:</b></td>

<td></td>
</tr>

<tr>
<td VALIGN=TOP></td>

<td>
All arguments are analogous to those in
<a href="#ZOLTAN_POST_MIGRATE_PP_FN"><b>ZOLTAN_POST_MIGRATE_PP_FN</b></a>.
Part-assignment arguments <i>import_to_part</i> and <i>export_to_part</i>
are not included, as processor and parts
numbers are considered to be the same in 
<a href="ug_interface_mig.html#Zoltan_Help_Migrate"><b>Zoltan_Help_Migrate</b></a>.
</td>
</tr>

<tr>
<td VALIGN=TOP><b>Default:</b></td>

<td></td>
</tr>

<tr>
<td VALIGN=TOP></td>

<td>No post-processing is done if a <b>ZOLTAN_POST_MIGRATE_FN</b> is not registered.</td>
</tr>
</table>


<p>
<hr WIDTH="100%">[<a href="ug.html">Table of Contents</a>&nbsp; | 
<a href="ug_param.html">Next:&nbsp;
Zoltan Parameters and Output Levels</a>&nbsp; |&nbsp; <a href="ug_query_lb.html">Previous:&nbsp;
Load-Balancing Query Functions</a>&nbsp; |&nbsp; <a href="https://www.sandia.gov/general/privacy-security/index.html">Privacy and Security</a>]
</body>
</html>
